package br.com.upis.sispat.service.impl;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.upis.sispat.dao.Dao;
import br.com.upis.sispat.entity.Usuario;
import br.com.upis.sispat.enums.StatusAtivo;
import br.com.upis.sispat.exception.SeamCoreException;
import br.com.upis.sispat.service.UsuarioService;

@Service("usuarioService")
public class UsuarioServiceImpl implements UsuarioService {

	private Dao<Usuario> usuarioDao;

	private static final long serialVersionUID = -3306452448892268624L;

	@SuppressWarnings("unchecked")
	public List<Usuario> search(Usuario usuario) throws SeamCoreException {

		StringBuilder hql = new StringBuilder();
		hql.append(" select u from Usuario u ");
		hql.append(" where 1=1 ");

		List<String> listaParam = new ArrayList<String>();

		if (usuario.getNomeUsuario() != null
				&& usuario.getNomeUsuario().length() > 0) {
			hql.append(" and u.nomeUsuario like ? ");
			listaParam.add(usuario.getNomeUsuario());
		}

		if (usuario.getIdAcesso() != null && usuario.getIdAcesso() > 0) {
			hql.append(" and u.idAcesso = ? ");
			listaParam.add(usuario.getIdAcesso().toString());
		}

		if (usuario.getStatus() != null && usuario.getStatus().length() > 0) {
			hql.append(" and u.status = ? ");
			listaParam.add(usuario.getStatus().toString());
		}

		int i = 0;

		Session session = usuarioDao.getSession();

		Transaction tx = session.getTransaction();

		tx.begin();

		Query query = session.createQuery(hql.toString());

		if (usuario.getNomeUsuario() != null
				&& usuario.getNomeUsuario().length() > 0) {

			query.setString(i++, "%" + usuario.getNomeUsuario() + "%");
		}

		if (usuario.getIdAcesso() != null && usuario.getIdAcesso() > 0) {
			query.setInteger(i++, usuario.getIdAcesso());
		}

		if (usuario.getStatus() != null && usuario.getStatus().length() > 0) {
			query.setString(i++, usuario.getStatus());
		}

		List<Usuario> lista = query.list();

		tx.commit();

		return lista;
	}

	@Override
	@Transactional
	public void save(Usuario usuario) throws SeamCoreException {

		try {
			usuarioDao.create(usuario);
		} catch (SQLException e) {
			throw new SeamCoreException(e);
		}

	}

	@Override
	@Transactional
	public void delete(Usuario usuario) throws SeamCoreException {
		try {
			usuario.setStatus(StatusAtivo.STATUS_INATIVO.getValor());
			usuarioDao.update(usuario);
		} catch (SQLException e) {
			throw new SeamCoreException(e);
		}

	}

	@Override
	@Transactional
	public void update(Usuario usuario) throws SeamCoreException {
		try {
			manterSenhaUsuario(usuario);
			usuarioDao.update(usuario);
		} catch (SQLException e) {
			throw new SeamCoreException(e);
		}

	}

	private void manterSenhaUsuario(Usuario usuario) {

		if (usuario.getSenha() == null || usuario.getSenha().equals("")) {

			Usuario usuarioAntigo = usuarioDao.getObjectFromId(Usuario.class,
					usuario.getCodigo());

			usuario.setSenha(usuarioAntigo.getSenha());
		}

	}

	public Usuario getById(Long id) {

		return usuarioDao.getObjectFromId(Usuario.class, id);
	}

	@Autowired
	public void setUsuarioDao(Dao<Usuario> usuarioDao) {
		this.usuarioDao = usuarioDao;
	}

	@Override
	public Usuario getUsuarioByLogin(String login, String senha) {

		Usuario usuario = null;

		StringBuilder hql = new StringBuilder();
		hql.append(" select u from Usuario u ");
		hql.append(" where u.login = ? ");

		if (senha != null && !senha.equals("")) {
			hql.append(" and u.senha = ? ");
			usuario = usuarioDao.getSingleObject(hql.toString(), login, senha);
		}

		usuario = usuarioDao.getSingleObject(hql.toString(), login);

		return usuario;
	}

}
